function WebGLExtensions(gl) {
  const extensions = {};

  function getExtension(name) {
    if (extensions[name] !== undefined) {
      return extensions[name];
    }

    let extension;

    switch (name) {
      case 'WEBGL_depth_texture':
        extension =
          gl.getExtension('WEBGL_depth_texture') ||
          gl.getExtension('MOZ_WEBGL_depth_texture') ||
          gl.getExtension('WEBKIT_WEBGL_depth_texture');
        break;

      case 'EXT_texture_filter_anisotropic':
        extension =
          gl.getExtension('EXT_texture_filter_anisotropic') ||
          gl.getExtension('MOZ_EXT_texture_filter_anisotropic') ||
          gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');
        break;

      case 'WEBGL_compressed_texture_s3tc':
        extension =
          gl.getExtension('WEBGL_compressed_texture_s3tc') ||
          gl.getExtension('MOZ_WEBGL_compressed_texture_s3tc') ||
          gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');
        break;

      case 'WEBGL_compressed_texture_pvrtc':
        extension =
          gl.getExtension('WEBGL_compressed_texture_pvrtc') || gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');
        break;

      default:
        extension = gl.getExtension(name);
    }

    extensions[name] = extension;

    return extension;
  }

  return {
    has(name) {
      return getExtension(name) !== null;
    },

    init(capabilities) {
      if (capabilities.isWebGL2) {
        getExtension('EXT_color_buffer_float');
      } else {
        getExtension('WEBGL_depth_texture');
        getExtension('OES_texture_float');
        getExtension('OES_texture_half_float');
        getExtension('OES_texture_half_float_linear');
        getExtension('OES_standard_derivatives');
        getExtension('OES_element_index_uint');
        getExtension('OES_vertex_array_object');
        getExtension('ANGLE_instanced_arrays');
      }

      getExtension('OES_texture_float_linear');
      getExtension('EXT_color_buffer_half_float');
    },

    get(name) {
      const extension = getExtension(name);

      if (extension === null) {
        console.warn(`THREE.WebGLRenderer: ${name} extension not supported.`);
      }

      return extension;
    },
  };
}

export { WebGLExtensions };
